package com.lanyou.esb.redis.proxy;

import java.io.IOException;
import java.util.List;
import java.util.Map;
import java.util.Set;

import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonMappingException;

/**
 * 针对Hash数据类型的Redis代理接口
 * 
 * @author Davey.wu
 */
public interface HashJedisProxy<T> extends JedisProxy<T> {
	/**
	 * 根据字段名及位置生成KEY值
	 * 
	 * @param map
	 * @return
	 */
	String generateKey(Map<String, String> map);

	/**
	 * 获取组成REDIS键的字段集合：key:字段名,value:字段在KEY中的位置
	 * 
	 * @return
	 */
	Map<String, Integer> getKeyFields();

	/**
	 * 获取组成REDIS键的HASH表：key:字段，value:字段值
	 * 
	 * @param target
	 * @return
	 */
	Map<String, String> getKeyMap(T target);

	/**
	 * 分解REDIS键
	 * 
	 * @param key
	 *            ：键值
	 * @return
	 */
	Map<String, Object> decodeKey(String key);

	/**
	 * 获取存储REDIS hash类型数据的键值
	 * 
	 * @return
	 */
	String getHashKey();

	/**
	 * 加载所有数据，以HASH方式存储到REDIS
	 * 
	 * @throws JsonProcessingException
	 */
	void loadHashAll() throws JsonProcessingException;

	/**
	 * 重新加载指定的对象，以HASH方式存储到REDIS
	 * 
	 * @param t
	 *            ：目标对象
	 * @throws JsonProcessingException
	 */
	void reloadHash(T t) throws JsonProcessingException;

	/**
	 * 获取REDIS Hash类型的数据
	 * 
	 * @param field
	 *            :域名
	 * @return
	 * @throws JsonParseException
	 * @throws JsonMappingException
	 * @throws IOException
	 */
	T hget(String field) throws JsonParseException,
			JsonMappingException, IOException;

	/**
	 * 保存REDIS Hash类型数据
	 * 
	 * @param key
	 *            ：键值
	 * @param target
	 *            ：目标
	 * @return
	 * @throws JsonProcessingException
	 */
	long hset(String key, T target)
			throws JsonProcessingException;

	/**
	 * 删除REDIS Hash类型数据
	 * 
	 * @param target
	 * @return
	 */
	long hdel(T target);

	/**
	 * 删除REDIS Hash类型数据
	 * 
	 * @param keys
	 * @param field
	 * @return
	 */
	long hdel(List<String> keys, String field);

	/**
	 * 获取所有键值对
	 * 
	 * @param key
	 *            ：键
	 * @return
	 */
	Map<String, String> hgetAll(String key);

	/**
	 * 获取所有域名
	 * 
	 * @param key
	 *            ：键
	 * @return
	 */
	Set<String> hkeys(String key);

	/**
	 * 获取所有值
	 * 
	 * @param key
	 *            ：键
	 * @return
	 */
	List<String> hvals(String key);
}
